---@diagnostic disable: undefined-field, undefined-global, lowercase-global
------------------------------------------------------------------------------------------
--1. 本文件作用是对商店页面的App进行下载并且独立运行app
------------------------------------------------------------------------------------------
local iCool_DataHandleDebugSignal = true


--1. 对下载的文件进行解压
local appTotalSize = nil
--2. 对下载的文件进行存储到SD卡
local getDirContent
--SD卡中的zip文件信息表
sdZipInfo = {}
--app下载链接头
local appUrlHead = "http://openluat-luatcommunity.oss-cn-hangzhou.aliyuncs.com/attachment/"
--app是否下载成功
local downloadSuccess = true
--sd卡盘符
local iCoolSDCardRoot = "/sdcard0"
--app数据存储地址
local iCoolAppDataStoreDir = iCoolSDCardRoot.."/iCool/applications"
local iCoolTemDataStoreDir = iCoolSDCardRoot.."/iCool/temStorage"
--定位要写入的app数据
local appIsToWriteData = nil
--临时函数变量
local zipToAppTableVar = nil
local getAppJsonInfoVar = nil
--app下载定时器ID
local appDlId = nil
local appdowningCont = nil
--判断是否处于商城app下载中
local iCoolStoreAppDling = -1
--zip文件临时存储表
----------------------------------------------------------------------------------------------
--------------------从SD卡中读取zip格式的文件，并且把他给解压出来到SD卡---------------------------
--文件必须为zip格式
--其中具体的结构为：
--               /── Google.zip
--                      ├─ Google.json
--                      ├─ resource
--                            ├─ icon.png(jpg/jpeg/bin)
--                            └─ ...
--                      ├─ main.lua
--                      ├─ code1.lua
--                      ├─ code2.lua
--                      └─ ...
-----------------------------------------------------------------------------------------------
--1. 获取地址中的zip文件
getDirContent = function(dirPath, level)
    local ftb = {}
    local dtb = {}
    level = level or "    "
    local tag = " "
	if io.opendir(dirPath) == 0 then
		log.error("FsTest.getDirContent", "无法打开目标文件夹\"" .. dirPath .. "\"")
		return
	end
    while true do
        local fType, fName, fSize = io.readdir()
        if fType == 32 then
            table.insert(ftb, {name = fName, path = dirPath .. "/" .. fName, size = fSize})
        elseif fType == 16 then
            table.insert(dtb, {name = fName, path = dirPath .. "/" .. fName})
        else
            break
        end
    end
    io.closedir(dirPath)
    for i = 1, #ftb do 
        if i == #ftb then
            log.info(tag, level .. "└─", ftb[i].name, "[" .. ftb[i].size .. " Bytes]", "----[Dir]" .. ftb[i].path)
        else
            log.info(tag, level .. "├─", ftb[i].name, "[" .. ftb[i].size .. " Bytes]", "----[Dir]" .. ftb[i].path)
        end
    end
    for i = 1, #dtb do 
        if i == #dtb then
            log.info(tag, level.."└─", dtb[i].name)
            getDirContent(dtb[i].path, level .. "  ")
        else
            log.info(tag, level.."├─", dtb[i].name)
            getDirContent(dtb[i].path, level .. "│ ")
        end
    end
    ------------------------------------------------------------------------
    --写入数据到app信息表
    zipToAppTableVar(ftb)
end
--2. 把获取的zip文件中的信息写入到app信息表中
local function zipToAppTable(ftb)
    local isStore = nil
    for i = 1, #ftb do
        local oo = string.match(ftb[i].name, "%.(%w+)$")
        local ol = string.sub(ftb[i].path, 1, #iCoolTemDataStoreDir)
        isStore = true
        --判断是否存在zip文件
        if (oo)then
            if ((oo == "zip" or oo == "ZIP") and ol == iCoolTemDataStoreDir)then
                --从app配置文件中读取app配置，防止app丢失
                for j = 1, #sdZipInfo do
                    --防止重复写入相同的app
                    if (ftb[i].name == sdZipInfo[j][1])then
                        isStore = false
                    else
                    end
                end
                if (isStore)then
                    sdZipInfo[#sdZipInfo+1] = {}
                    sdZipInfo[#sdZipInfo][1] = ftb[i].name
                    sdZipInfo[#sdZipInfo][2] = ftb[i].path
                    sdZipInfo[#sdZipInfo][3] = ftb[i].size
                    --用于调试查看文件系统
                    if (iCool_DataHandleDebugSignal)then
                        print("存在新数据写入")
                    end
                end
            end
        end
    end
end
zipToAppTableVar = zipToAppTable
--3. app数据存储
local function appDataDlSuccess(result,prompt,head,body)
    if (result)then
        --获取sd卡中保存的临时app压缩包信息
        getDirContent(iCoolSDCardRoot)
        --若其中存在app压缩包
        if (#sdZipInfo > 0)then
            local nf = nil
            local appToWriteName = nil
            --解压所有的zip文件到规定的文件中
            for i = 1, #sdZipInfo do
                --创建一个和zip同名的文件夹
                local zipCNF = iCoolAppDataStoreDir.."/"..string.sub(sdZipInfo[i][2], 
                                                        #"/sdcard0/iCool/temStorage/1", (-2 - #string.match(sdZipInfo[i][2], "%.(%w+)$")))
                --创建一个和压缩包同名的文件夹
                rtos.make_dir(zipCNF)
                --判断是否是要写入的app数据
                --主要是获取 "/sdcard0/iCool/applications/" 后的app的根文件夹
                appToWriteName = string.match(zipCNF, "%/(%w+)$")
                if (appToWriteName == appIsToWriteData)then
                    --对app进行数据写入
                    local zfile, err = zip.open(sdZipInfo[i][2])
                    if (zfile)then
                        --解压出所有文件到SD卡
                        local zf, zerr, s, fw = nil, nil, nil, nil
                        for file in zfile:files() do
                            print("\t\t"..file.filename)
                            --获取压缩包里的文件的名称
                            if (string.sub(file.filename, -1) == "/")then
                                rtos.make_dir(zipCNF.."/"..string.sub(file.filename, 1, -2))
                            else
                                zf, zerr = zfile:open(file.filename)
                                s = zf:read("*a")
                                zf:close()
                                --如果图片是jpeg格式，则转为jpg格式
                                -- if((string.sub(file.filename, -4, -1) == "jpeg") or (string.sub(file.filename, -4, -1) == "JPEG"))then
                                --     file.filename = string.sub(file.filename, 1, -5).."jpg"
                                -- end
                                fw = io.open(zipCNF.."/"..file.filename,"w")
                                if fw then
                                    fw:write(s)
                                    fw:close()
                                end
                            end
                        end
                        print("-------------------")
                        zfile:close()
                    end
                end
            end
            --用于调试查看文件系统
            if (iCool_DataHandleDebugSignal)then
                print("下载写入后SD卡数据")
                getDirContent("/sdcard0")
            end
            --返回获取到的app信息
            getAppJsonInfoVar()
        end
    end
end
--4. 获取到app的配置信息
local function getAppJsonInfo()
    local cont = io.readFile(iCoolAppDataStoreDir.."/"..appIsToWriteData.."/app.json")
    if (cont)then
        local kk = json.decode(cont)
        local appName =  kk["name"]
        local appPngDir = kk["icon"]
        --判断是否获取到app名称
        if (not appName)then
            appName = "未命名"
        end
        --判断是否获取到app图标地址
        if (not appPngDir)then
            appPngDir = "/lua/Widgets.bin"
        else
            -- if ((string.sub(appPngDir, -4, -1) == "jpeg") or (string.sub(appPngDir, -4, -1) == "JPEG"))then
            --     appPngDir = string.sub(appPngDir, 1, -5).."jpg"
            -- end
            print("图标", appPngDir)
            appPngDir = iCoolAppDataStoreDir.."/"..appIsToWriteData.."/"..appPngDir
        end
        --同时把app配置信息存储到app配置文件中
        local data = appTableDataInit()
        if (type(data) == "table")then
            --获取app的位置以及要显示在哪个界面
            local appPox_X, appPox_Y, appScr = appsAutoLayout()
            if (appPox_X)then
                --把app信息的表插入app信息总表中
                --其中 appIsToWriteData 为 app 的根文件夹
                table.insert(data, {appName, appPngDir, appPox_X, appPox_Y, appScr, "storeApp", appIsToWriteData})
            end
            --把信息转为json格式
            local jsonData = json.encode(data)
            --打开app信息文件写入json数据
            local appfd = io.open("/sdcard0/config.json", "w")
            appfd:write(jsonData)
            appfd:close()
            downloadSuccess = true
            --发送下载完成的消息
            iCoolStoreAppDling = 1
        else
            print("app配置文件存在问题")
        end
    end
end
getAppJsonInfoVar = getAppJsonInfo
local temBool = true
local function appDlingSignal()
    if (iCoolStoreAppDling == 0 and temBool)then
        temBool = false
        appdowningCont = lvgl.cont_create(lvgl.scr_act(), nil)
        lvgl.obj_set_size(appdowningCont, 400, 80)
        lvgl.obj_align(appdowningCont, nil, lvgl.ALIGN_IN_TOP_MID, 0, 10)
        lvgl.obj_add_style(appdowningCont, lvgl.CONT_PART_MAIN, store_nCSigContStyle)
        lvgl.obj_set_state(appdowningCont, lvgl.STATE_DISABLED)
        local appDlSignal = lvgl.label_create(appdowningCont, nil)
        lvgl.label_set_text(appDlSignal, "正在下载中，请勿操作iCool手机")
        lvgl.obj_align(appDlSignal, appdowningCont, lvgl.ALIGN_CENTER, 0, 0)
        lvgl.obj_add_style(appDlSignal, lvgl.LABEL_PART_MAIN, store_nCSigFontStyle)
        lvgl.obj_set_state(appDlSignal, lvgl.STATE_DISABLED)
    elseif (iCoolStoreAppDling == 1) then
        temBool = true
        lvgl.obj_del(appdowningCont)
        --停止循环定时器
        sys.timerStop(appDlId)
        iCoolStoreAppDling = -1
        appDlId = nil
    end
end
----------------------------------------------------------------------------------------
--对外调用的数据回调函数
----------------------------------------------------------------------------------------
--app数据接收  
--whichApp      下载的app压缩包的网站名称  
function appDataRecieve(whichApp)
    --判断是否sd卡初始化成功
    if (_G.sdInitSuccessed)then
        --判断sd卡是否打开成功
        if (io.opendir("/sdcard0") == 1)then
            --防止重复下载
            if (downloadSuccess)then
                --app正在下载中
                iCoolStoreAppDling = 0
                --设置定时器去判断是否处于下载中
                appDlId = sys.timerLoopStart(appDlingSignal, 200)
                --防止数据未下载成功
                downloadSuccess = false
                --把下载的app压缩包存储在 /sdcard0/temStorage/ 目录下
                appIsToWriteData = whichApp
                http.request("GET", appUrlHead.."20210914150302692_PacMan.zip"
                ,nil,nil,nil,nil,appDataDlSuccess, iCoolSDCardRoot.."/iCool/temStorage/"..whichApp..".zip")
            end
        end
    end
end
